home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / glass / glass.lha / GLASS / glammar / gg03.c < prev    next >
C/C++ Source or Header  |  1991-01-21  |  6KB  |  225 lines

  1. /*
  2.  
  3.     This file is a part of the GLAMMAR source distribution 
  4.     and therefore subjected to the copy notice below. 
  5.     
  6.     Copyright (C) 1989,1990  Eric Voss, ericv@cs.kun.nl 
  7.  
  8.     This program is free software; you can redistribute it and/or modify
  9.     it under the terms of the GNU General Public License as published by
  10.     the Free Software Foundation version 1
  11.  
  12.     This program is distributed in the hope that it will be useful,
  13.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.     GNU General Public License for more details.
  16.  
  17.     You should have received a copy of the GNU General Public License
  18.     along with this program; if not, write to the Free Software
  19.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. */
  21. /* hash names */
  22. #include "gg1.h"
  23. #include "gg2.h"
  24. int nr_names = 0;
  25. initnametable()
  26. {
  27.    register int    count;
  28.    count = 0;
  29.    while (count < maxnt)
  30.       nametable[count++] = NULL;
  31. }
  32.  
  33.  
  34. addname()
  35. {
  36.    int             count,
  37.                    limit;
  38.    count = hashindex;
  39.    limit = (hashindex - 1) & (maxnt - 1);
  40.    if (count > maxnt) {
  41.      fprintf(stderr, "compiler error in `addname': index too high (max = %d)\n",
  42.               maxnt);
  43.       fprintf(stderr, "   count = %d, limit = %d, line = %d\n ",
  44.               count, limit, line);
  45.       exit(3);
  46.    }
  47.    while (nametable[count] != NULL && count != limit) {
  48.       if (mystrcmp(&(chartable[prevcharindex]), nametable[count])) {
  49.          string = nametable[count];
  50.          charindex = prevcharindex;
  51.          return;
  52.       }
  53.       name_clashes += 1;
  54.       if (++count == maxnt)
  55.          count = 0;
  56.    }
  57.    if (count == limit) {
  58.       fprintf(stderr, "compiler error: nametable overflow\n");
  59.       fprintf(stderr, " -- index = %d, name = `%s', line = %d\n",
  60.               count, &(chartable[prevcharindex]), line);
  61.       exit(18);
  62.    }
  63.    nr_names += 1;
  64.    nametable[count] = &chartable[prevcharindex];
  65.    string = nametable[count];
  66.    chartable[charindex++] = '\0';
  67.    prevcharindex = charindex;
  68.    if (charindex >= maxchars -256)
  69.        alloc_chartable();
  70.    return;
  71. }
  72.  
  73. mystrcmp(s1, s2)
  74.    register char  *s1,
  75.                   *s2;
  76. {
  77.    while (*s1 == *s2++) {
  78.       if (*s1++ == '\0')
  79.          return true;
  80.    }
  81.    return false;
  82. }
  83.  
  84.  
  85.  
  86. #define TESTletter  (isalpha (thischar) )
  87. #define TESTmorename  (isalnum (thischar) )
  88.  
  89. name()
  90. {
  91.    int             curchar;
  92.    if (!TESTletter)
  93.       return false;
  94.    hashindex = 0;
  95.    curchar = 0;
  96.    do {
  97.       chartable[charindex++] = thischar;
  98.       hashindex += thischar << (++curchar & 7);
  99.       getnextchar();
  100.    } while (TESTmorename);
  101.    if (thischar == '\'') {
  102.       chartable[charindex++] = thischar;
  103.       hashindex += thischar << (++curchar & 7);
  104.       getnextchar();
  105.    }
  106.    hashindex &= (maxnt - 1);
  107.    chartable[charindex++] = '\0';
  108.    addname();
  109.    return true;
  110. }
  111.  
  112. #define USC  (underscore_allowed && (thischar == '_'))
  113. #define ALFA  (isalpha(thischar))
  114. #define ALNUM  (isalnum(thischar))
  115. #define OPEN  (thischar == '(')
  116. #define SEQ  (thischar == '*' || thischar == '+'  || thischar == '?'|| thischar == '\'')
  117. #define TESTletter_open   (ALFA || OPEN || SEQ)
  118. #define TESTmore_name_display   (ALNUM || OPEN || SEQ || USC)
  119.  
  120. name_display_mix()
  121. {
  122.    int             curchar=0,nmix=0,hashidx = 0;
  123.    char nm[10000];
  124.  
  125.    if (!TESTletter_open )
  126.       return false;
  127.    lastaffixtree = nil;
  128.    brother = nil;
  129.    while (TESTmore_name_display)
  130.       if (mdisplay());
  131.       else if (thischar == '\'') {
  132.          nm[nmix++] = '_';
  133.          nm[nmix++] = '0';
  134.          hashidx += '_' << (++curchar & 7);
  135.          getnextchar();
  136.       }
  137.       else if (thischar == '*') {
  138.          nm[nmix++] = '_';
  139.          nm[nmix++] = '1';
  140.          hashidx += '_' << (++curchar & 7);
  141.          hashidx += '*' << (++curchar & 7);
  142.          getnextchar();
  143.       }
  144.       else if (thischar == '+') {
  145.          nm[nmix++] = '_';
  146.          nm[nmix++] = '2';
  147.          hashidx += '+' << (++curchar & 7);
  148.          getnextchar();
  149.       }
  150.       else if (thischar == '?') {
  151.          nm[nmix++] = '_';
  152.          nm[nmix++] = '4';
  153.          hashidx += '?' << (++curchar & 7);
  154.          getnextchar();
  155.       }
  156.  
  157.       else {
  158.          nm[nmix++] = thischar;
  159.          hashidx += thischar << (++curchar & 7);
  160.          getnextchar();
  161.       }
  162.    hashidx &= (maxnt - 1);
  163.    hashindex = hashidx;
  164.    nm[nmix] = '\0';
  165.    for (nmix = 0;nm [nmix] != '\0'; )
  166.       chartable[charindex++] = nm[nmix++] ;
  167.    chartable[charindex++] = '\0';
  168.    addname();
  169.    ntname = string;
  170.    return true;
  171. }
  172.  
  173.  
  174. mdisplay()
  175. {
  176.    if (open_symbol()) {
  177.       int first = lastaffixtree;
  178.       brother = nil;
  179.       affixes();
  180.       if (first == nil)
  181.         lastaffixtree = brother;
  182.       else {
  183.        int afx;
  184.        for (afx=first; BROTHER (afx) != nil; afx = BROTHER(afx));
  185.        BROTHER(afx) = brother;
  186.        lastaffixtree = first;
  187.        brother = first;
  188.      } 
  189.      if (close_symbol());
  190.      else {
  191.          errmsg("CLOSE symbol");
  192.          skiptopoint_symbol();
  193.          rules(rnode);
  194.          usefullerrmsg = false;
  195.       }
  196.       return true;
  197.    }
  198.    return false;
  199. }
  200.  
  201. /* name_display()
  202. {
  203.    if (name() ) {
  204.      ntname = string;
  205.      displayoption();
  206.      return true;
  207.    }
  208.    return false;
  209. }
  210. */
  211.  
  212. alloc_chartable() {
  213.   chartable = (char *) malloc((maxchars + 32));
  214.   charindex = 0;
  215.   symbol_table_size += maxchars+32;
  216.   prevcharindex = 0;
  217.   if (ast == NULL) {
  218.    fprintf(stderr,"glammar fatal msg: no %d bytes available for symbol table\n",
  219.        maxchars);
  220.    exit(1);
  221.   }
  222.   if (verbose_flag) 
  223.    fprintf(stderr,"alloc sym: %d bytes available for sym space\n",maxchars);
  224. }
  225.